#ifndef _PQ_
#define _PQ_

#include "noeud.hpp"

struct item_prio {
    Noeud* n;
    int val;
};

struct file_prio {
    int ind_min;
    int capa;
    int nb_items;
    item_prio** file;
};

file_prio * initFilePrio(bool verbose = false);
/*  précondition : aucune
 *  postcondition : renvoie un pointeur sur une structure file_prio
 *  file_prio est une structure de type file de priorité minimum
 */

void ajoutPriorite(file_prio * fp, Noeud* n, int val = -1, bool verbose = false);
/*  précondition : fp et n initialisés
 *      val doit être :
 *          - égale à -1 : priorité = infinity (la plus grande)
 *          - >= 0 :    priorité = val
 *  postcondition : rajoute un élement à fp, contenant n ainsi que la valeur
 *  de priorité passés en paramètres (par défaut val = -1, équivalent à infinity
 *  dans les fonctions du module)
 */

Noeud* enleveMin(file_prio* fp, bool verbose = false);
/*  précondition : fp initialisé, fp possède au moins un élément
 *  postcondition : renvoie un pointeur sur le noeud de priorité minimum
 *  et l'enlève de la file de priorité
 */

void diminuePriorite(file_prio* fp, Noeud* n, int val, bool verbose = false);
/*  précondition : fp et n initialisés, n présent dans fp
 *      val doit être :
 *          - égale à -1 : priorité = infinity (la plus grande)
 *          - >= 0 :    priorité = val
 *  postcondition : modifie la valeur de priorité de l'element contenant n en la
 *  passant à val
 */

bool contientElem(file_prio* fp, Noeud* n);
/*  précondition : fp et n initialisés
 *  postcondition : renvoie un booléen true ou false suivant la présence de
 *  l'élement n dans fp
 */

bool fileVide(file_prio* fp);
/* précondition : fp initialisée
 * postcondition : renvoie un booléen qui renseigne si la file de priorité passée
 * en paramètre est vide
 */

void testamentFile(file_prio* fp);
/*  précondition : fp initialisée
 *  postcondition   : libère la file de priorité, ainsi que tous les élements
 *  qu'elle contient
 */
#endif // _PQ_
